/**
 * Review控制器模块
 */
const express = require("express");
const util = require("../common/util");
const ReviewDB = require("../model/db/review");
/**
 * 获取评论信息
 * @param {express.Request} req 请求
 * @param {express.Response} res 响应 
 */
function find(req, res){
    (async function(){
        let db = ReviewDB.getInstance();
        let result = await db.find(req.params.id, req.session.user.id);
        //await db.close():
        util.logFormat(`获取【${req.params.id}】评论信息%O`, result);
        res.json(util.FormatJSONData(200, `获取评论信息成功`,result));
    })();
}

/**
 * 获取指定书籍的评论列表信息
 * @param {express.Request} req 请求
 * @param {express.Response} res 响应 
 */
function findAll(req, res){
    (async function(){
        //1.处理输入的数据
        //FIXME：输入数据的正确性校验，一致性校验，完整性校验
        // let userId = req.session.user.id;
        let orderBy = req.query.order_by ? req.query.order_by : "id";
        let sort = req.query.sort ? req.query.sort : "desc";
        let limit = req.query.limit ? req.query.limit : -1;
        let offset = req.query.offset ? req.query.offset : -1;
        //2.访问数据
        let db = ReviewDB.getInstance();
        console.log("limit", limit)
        let result = await db.findAll( orderBy,sort,limit, offset);
        
        //3.处理输出数据
        //await db.close():
        util.logFormat(`获取留言信息列表%O`, result);
        res.json(util.FormatJSONData(200, `获取留言信息列表`,result));
    })();
}


/**
 * 新增评论信息
 * @param {express.Request} req 请求
 * @param {express.Response} res 响应 
 */
function add(req, res){
    (async function(){
        //FIXME:req.body的数据安全性校验(需要做)
        let review = {
            userId: req.session.user.id,
            content: req.body.content,
            messageTime: new Date(),
        };
        //2.访问数据
        let db = ReviewDB.getInstance();
        let result = await db.add(review);
        
        //3.处理输出数据
        //await db.close():
        util.log(`新增留言信息:lastID${result}`);
        res.json(util.FormatJSONData(201, `新增留言信息`,{lastID:result}));
    })();
}


/**
 * 回复信息
 * @param {express.Request} req 请求
 * @param {express.Response} res 响应 
 */
function update(req, res){
    (async function(){
         //FIXME:req.body的数据安全性校验（需要做）
         let review = {
            replyContent: req.body.replyContent,
            replyTime: new Date(),
            status: 2,
            id: req.params.id
        };

        //2.访问数据
        let db = ReviewDB.getInstance();
        //FIXME:插入数据前，考虑校验是否已存在ISBN
        let result = await db.update(review);
        
        //3.处理输出数据
        //await db.close():
        util.log(`更新评论信息:changes->${result}`);
        res.json(util.FormatJSONData(200, `回复指定的评论信息`,{result}));
    })();
}


/**
 * 删除评论信息
 * @param {express.Request} req 请求
 * @param {express.Response} res 响应 
 */
function remove(req, res){
    (async function(){
        //FIXME:数据合法性校验
        let reviewId = req.params.id;
         //2.访问数据
         let db = ReviewDB.getInstance();
         let review = await db.find(reviewId);
         let userId = review.user_id;
         console.log(userId);
         if(userId === req.session.user.id || req.session.user.role === 1){
            let result = await db.remove(reviewId);
         //4. 处理输出数据
         util.log(`删除评论信息:changes->${result}`);
         res.json(util.FormatJSONData(204, `成功删除评论信息`,{changes: result}));
     } else {
         // 如果不是评论所有者或管理员，则返回错误信息
         res.json(util.FormatJSONData(403, `无权限删除评论信息`,{}));
     }
    })();
}

/**
 * 获取指定书籍的评论总数
 * @param {express.Request} req 请求
 * @param {express.Response} res 响应 
 */
function getCount(req, res){
    (async function(){
        //FIXME:数据合法性校验
         //2.访问数据
        //  let bookId = req.query.book_id;
         let db = ReviewDB.getInstance();
         let result = await db.getCount();
         
         //3.处理输出数据
         //await db.close():
         util.logFormat(`获取留言总数：`, result);
         res.json(util.FormatJSONData(200, `成功获取留言总数`,result));
    })();
};

    /**
 * 获取指定用户的评论列表信息
 * @param {express.Request} req 请求
 * @param {express.Response} res 响应 
 */
function findAllByUserId(req, res){
    (async function(){
        //1.处理输入的数据
        //FIXME：输入数据的正确性校验，一致性校验，完整性校验
        let userId = req.session.user.id;
        let orderBy = req.query.order_by ? req.query.order_by : "id";
        let sort = req.query.sort ? req.query.sort : "desc";
        let limit = req.query.limit ? req.query.limit : -1;
        let offset = req.query.offset ? req.query.offset : -1;
        //2.访问数据
        let db = ReviewDB.getInstance();
        let result = await db.findAllByUserId(userId, orderBy,sort,limit, offset);
        
        //3.处理输出数据
        //await db.close():
        util.logFormat(`获取指定【${userId}】用户评论信息列表%O`, result);
        res.json(util.FormatJSONData(200, `获取指定用户的评论信息列表`,result));
    })();
}

/**
 * 获取指定用户的评论总数
 * @param {express.Request} req 请求
 * @param {express.Response} res 响应 
 */
function getCountByUserId(req, res){
    (async function(){
        //FIXME:数据合法性校验
         //2.访问数据
         let userId = req.query.userId;
         let db = ReviewDB.getInstance();
         let result = await db.getCountByUserId(userId);
         
         //3.处理输出数据
         //await db.close():
         util.logFormat(`获取指定用户:【${userId}】评论总数：%O`, result);
         res.json(util.FormatJSONData(200, `获取指定用户的评论总数`,result));
    })();
};


module.exports = {
    find,
    findAll,
    add,
    update,
    remove,
    getCount,
    findAllByUserId,
    getCountByUserId,
};